﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __79EF3299_DEA4_4b62_B4D0_E5601ECCB581__
#define __79EF3299_DEA4_4b62_B4D0_E5601ECCB581__

namespace xos_container
{
    class i_container;
}

namespace xos_aio
{
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // i_aio interface
    // 
    class i_aio : public xos::i_release
    {
    public:
        enum enumAioType
        {
            AIO_NONE,

            AIO_TCP_INIT_RET,
            AIO_TCP_INIT,
            AIO_TCP_ACCPET_RET,
            AIO_TCP_ACCPET,
            AIO_TCP_CONNECT_RET,
            AIO_TCP_CONNECT,
            AIO_TCP_RECV_RET,
            AIO_TCP_RECV,
            AIO_TCP_SEND_RET,
            AIO_TCP_SEND,
            AIO_TCP_SHUTDOWN_RET,
            AIO_TCP_SHUTDOWN,
            AIO_TCP_CLOSE_RET,
            AIO_TCP_CLOSE,

            AIO_UDP_INIT_RET,
            AIO_UDP_INIT,
            AIO_UDP_RECV_RET,
            AIO_UDP_RECV,
            AIO_UDP_SEND_RET,
            AIO_UDP_SEND,
            AIO_UDP_SHUTDOWN_RET,
            AIO_UDP_SHUTDOWN,
            AIO_UDP_CLOSE_RET,
            AIO_UDP_CLOSE
        };

    public:
        virtual ~i_aio(){}

    public:
        // 
        // set callback. 
        // 
        virtual int set_callback( xos::f_runnable pCallback ) = 0;
        // 
        // post aio request
        // 
        virtual int post_request( xos_box::i_msg *& pMsg ) = 0;
    };

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // i_aio_mgr
    // 
    class i_aio_mgr : public xos::i_release
    {
    public:
        virtual ~i_aio_mgr(){}

    public:
        // 
        // set callback thread. all aios use ONE callback thread.
        // 
        virtual int set_callback_thread( xos_box::i_callback * pCallbackThread ) = 0;
        // 
        // create aio
        // 
        virtual int create( i_aio ** ppv ) = 0;
    };

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // export function
    // 
    typedef int ( * f_create )( xos_container::i_container * pContainer, i_aio_mgr ** ppv );


} // xos_aio

#endif // __79EF3299_DEA4_4b62_B4D0_E5601ECCB581__
